<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>wissel.net Usability - Productivity - Business - The web - Singapore and Twins</title>
	<link>https://wissel.net/blog/stories.rss</link>
	<description>Thoughts, Insights and Opinions of Stephan H. Wissel. Topics included: Salesforce, Lotus Notes and Domino, IBM Websphere, NodeJS, JavaScript,  J2EE, .Net, Software Archtecture, Personcentric Development, Agile Software, SDLC, Singapore and my Twins</description>
	<language>en,de</language>
	<copyright>(C) 2003 - 2021 Stephan H. Wissel, All rights reserved</copyright>
	<pubDate>Sat, 17 Oct 2026 18:46:11 +0000</pubDate>
<item>
	<title>Shifting priorities</title>
	<description>&lt;p&gt;We all deal with priorities every day, your task view or Jira board, invites you to categorize all items into low, medium or high priority. What Jira got wrong ist the introduction of "priority urgent" as a result of folding the two-dimensional &lt;a href="https://en.wikipedia.org/wiki/Time_management#Eisenhower_method"&gt;Eisenhower method&lt;/a&gt; into a dropdown list.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Priority_Matrix"&gt;&lt;img src="/blog/images/2026/priorityMatrix.jpg" alt="Priority Matrix"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The challenge with "must fit in a dropdown" is that classifying task priority is only a prelude, a clarification, a segmentation of what we actually do, explicit or implicit:&lt;/p&gt;
&lt;h2&gt;&lt;a href="#priorities-are-not-classified-they-are-ranked" id="priorities-are-not-classified-they-are-ranked"&gt;&lt;/a&gt;Priorities are not classified, they are ranked&lt;/h2&gt;
&lt;p&gt;You followed &lt;a href="https://en.wikipedia.org/wiki/Dwight_D._Eisenhower"&gt;Ike&lt;/a&gt; and ended up with 20 tasks that are equally important and urgent. Equally? Nope. We all rank them using whatever additional properties we have at hand in our plan of execution.&lt;/p&gt;</description>
	<link>2026/10/shifting-priorities.html</link>
	<author>Stephan H. Wissel</author>
	<guid>b4184350-ca41-11f1-bd61-9f8f6c881a54</guid>
	<pubDate>17 October 2026</pubDate>

</item>
<item>
	<title>Builder pattern with flexible defaults</title>
	<description>&lt;p&gt;objects in real life are complex with many optionalities (my spell checker claims that isn't a word), that leave their imprint on their digital twins. To avoid exposing endless list of parameters you can use the &lt;a href="https://www.gofpattern.com/creational/patterns/builder-pattern.php"&gt;builder pattern&lt;/a&gt; described by the &lt;a href="https://en.wikipedia.org/wiki/Design_Patterns"&gt;GoF&lt;/a&gt;. It is the digital version of&lt;/p&gt;
&lt;h2&gt;&lt;a href="#this-is-what-i-know-lets-work-with-that" id="this-is-what-i-know-lets-work-with-that"&gt;&lt;/a&gt;This is what I know, let's work with that&lt;/h2&gt;
&lt;p&gt;You might want to go with the flow, and just pick a size and for the rest pick what everyone else is picking. The builder pattern does both gracefully.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;Ring r1 = Ring.builder().size(9)build();

Ring r2 = Ring.builder()
              .material(Material.PLATINUM)
              .size(9)
              .diamonds(3)
              .carats(0.75)
              .engraving("forever")
              .build();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or if Rust rocks your boat&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-rust"&gt;let r3 = RingBuilder::builder()
                     .material(Material::Platinum)
                     .size(9)
                     .diamonds(3)
                     .carats(0.75)
                     .engraving("forever")
                     .build();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So I was wondering what it would take using defaults from a configuration file instead hard coding them in the builder.&lt;/p&gt;</description>
	<link>2026/10/builder-pattern-with-flexible-defaults.html</link>
	<author>Stephan H. Wissel</author>
	<guid>f2d3ce20-c316-11f1-91a8-9d7aeaead3fb</guid>
	<pubDate>14 October 2026</pubDate>

</item>
<item>
	<title>JWT for machine to machine communication</title>
	<description>&lt;p&gt;There are plenty of &lt;a href="https://en.wikipedia.org/wiki/Identity_provider"&gt;IdP&lt;/a&gt; available that provide &lt;a href="https://openid.net/developers/how-connect-works/"&gt;OIDC&lt;/a&gt; flows for your users, including &lt;a href="https://www.hcl-software.com/domino"&gt;Domino&lt;/a&gt;, even if some can't read &lt;a href="https://www.rfc-editor.org/info/rfc6749/#page-23"&gt;RFC 6749&lt;/a&gt;) properly (I'm looking at you &lt;a href="https://www.okta.com/"&gt;Okta&lt;/a&gt; and &lt;a href="https://www.pingidentity.com/en.html"&gt;Ping&lt;/a&gt;)*&lt;/p&gt;
&lt;p&gt;When it comes to machine identity the situation becomes murkier. Machines might or might not be in your directory, directory admins might be reluctant to add machines etc. etc. So some utility needs to help out here&lt;/p&gt;
&lt;h2&gt;&lt;a href="#generating-access-token" id="generating-access-token"&gt;&lt;/a&gt;Generating access_token&lt;/h2&gt;
&lt;p&gt;I wrote about about &lt;a href="/blog/2020/01/generating-jwt-tokens-for-tests.html"&gt;generating JWT before&lt;/a&gt;, but in needs more context. So lets have a look what is actually needed:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;a means to identify the machine&lt;/li&gt;
 &lt;li&gt;the shape of the access token required&lt;/li&gt;
 &lt;li&gt;the trusted key pair to sign and validate the key&lt;/li&gt;
&lt;/ul&gt;</description>
	<link>2026/09/jwt-for-machine-to-machine-communication.html</link>
	<author>Stephan H. Wissel</author>
	<guid>e2cdbe90-b494-11f1-bb1f-5db4d7e49fbd</guid>
	<pubDate>20 September 2026</pubDate>

</item>
<item>
	<title>How we trained Lotus Notes</title>
	<description>&lt;p&gt;A recent post on &lt;a href="https://vowe.net/2026/09/10/lotus-notes-and-the-dangers-of-starting-from-scratch/"&gt;vowe.net&lt;/a&gt; pointing to &lt;a href="https://buttondown.com/blog/lotus-notes-email"&gt;Lotus Notes and the dangers of starting from scratch&lt;/a&gt; sent me down &lt;a href="https://digicomp.ch/en"&gt;the memory lane&lt;/a&gt; into the 1990ties.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#collaboration-training" id="collaboration-training"&gt;&lt;/a&gt;Collaboration training&lt;/h2&gt;
&lt;p&gt;Companies would send regular employees in groups of 10 -20 to a full day training to learn about that new thing "collaboration" (which gave the word collaborator a less perilous meaning). This is how it would go down in four modules:&lt;/p&gt;
&lt;p&gt;In the first module the Notes discussion database gets introduced. Participants would learn about topics, responses and response-to-responses. Without seeding lively discussions would emerge.&lt;/p&gt;
&lt;p&gt;The second module would focus on eMail, inbox, signature, encryption, richtext and - everybody's favorite - permanent pen.&lt;/p&gt;
&lt;p&gt;Followed by the lunch break&lt;/p&gt;
&lt;p&gt;The trainer would have prepared individual emails to all participants. Most of them with harmless request like "What's your favorite color" or "Ask your colleague about the last holiday". Two emails however had &lt;strong&gt;loaded&lt;/strong&gt; requests: "Stand up and put your one hand on your head" and "stand up and sing or hum &lt;a href="https://www.youtube.com/watch?v=ZfDpRzN2SBI"&gt;the national anthem&lt;/a&gt; (considered unproblematic in Switzerland)"&lt;/p&gt;
&lt;p&gt;Unsurprisingly hardly any of the recipients of such a message complied. The trainer would then ask a random participant to join in front to face the class, followed by the explanation: "You can't expect email to transport requests that a better issued in person (paraphrasing here)".&lt;/p&gt;
&lt;p&gt;Time for a coffee break with &lt;a href="https://tarasmulticulturaltable.com/gipfeli-swiss-crescent-shaped-pastries/"&gt;gipfeli&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The trainer then introduced module four "&lt;em&gt;Imagine you are all distributed in regional offices, so you can't show paper documents to each other, solve the problem I'll hand out&lt;/em&gt;". I then would hand out sheets of paper with the sentence "&lt;strong&gt;Every capital letter is part of the solution&lt;/strong&gt;". The sheets were all different with different letters capitalized, so the task was to collect the capital letters and form the solution &lt;strong&gt;LOTUS NOTES&lt;/strong&gt;. This wasn't explained to the participants though.&lt;/p&gt;
&lt;p&gt;Typically a barrage of emails would follow with different levels of speculation, curiosity, acceptance or ridicule. After 20-30 minutes the task would have been figured out at the "cost" of 100+ emails. The winning team (we informally tracked completion time) however took less that three minutes: One participant created a discussion entry "Please share all capital letters on your sheets" and sent a doc link (hyper link in today's lingo) to the rest. 10 response documents later they were done.&lt;/p&gt;
&lt;p&gt;Participant reported a better understanding of "Zusammenarbeit (collaboration)" and "Benachrichtigung (notification)" which made them appreciate the shiny new tool.&lt;/p&gt;
&lt;p&gt;I loved this sessions since the showed not only how to use the tools, but why and when and when not.&lt;/p&gt;</description>
	<link>2026/09/how-we-trained-lotus-notes.html</link>
	<author>Stephan H. Wissel</author>
	<guid>596e9380-ae7d-11f1-a336-d390c483f8d5</guid>
	<pubDate>12 September 2026</pubDate>

</item>
<item>
	<title>HCL opensources CouchCompanion</title>
	<description>&lt;p&gt;I'm a big fan of &lt;a href="https://couchdb.apache.org/"&gt;Apache CouchDB&lt;/a&gt;, so I was very pleased when I got the permission to opensource (is that even a verb) a R&amp;amp;D project we were working on for a while, meet &lt;a href="https://github.com/HCL-TECH-SOFTWARE/couch-companion-ui"&gt;CouchCompanion&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href="#fauxton-as-role-model" id="fauxton-as-role-model"&gt;&lt;/a&gt;Fauxton as role model&lt;/h2&gt;
&lt;p&gt;We were asking us, how would CouchDB's admin ui &lt;a href="https://github.com/apache/couchdb-fauxton"&gt;Fauxton&lt;/a&gt; look like when you rebuild today, what would be the tech stack and new or enhanced features. This is what we can up with:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;build with webcomponents, namely &lt;a href="https://webawesome.com/"&gt;Webawesome&lt;/a&gt; and &lt;a href="https://lit.dev/"&gt;Lit&lt;/a&gt;, no big framework like react or angular&lt;/li&gt;
 &lt;li&gt;Native &lt;code&gt;fetch()&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;All JSON and JS Code editable with the Monaco editor (the one used in VSCode)&lt;/li&gt;
 &lt;li&gt;Support to build Mango queries and indici&lt;/li&gt;
 &lt;li&gt;Sync with version control (Github for the moment, fighting with CORS and CSP)&lt;/li&gt;
 &lt;li&gt;dark/lght mode&lt;/li&gt;
 &lt;li&gt;UI to configure OIDC IdP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... and more. There is a &lt;a href="https://github.com/HCL-TECH-SOFTWARE/couch-companion-ui/tree/main/docs/walkthrough"&gt;capability walkthrough&lt;/a&gt; available. But to really get a feel, just run the container:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;docker run -d --name couch-companion -p 5984:5984 \
  -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=&amp;lt;choose one&amp;gt; \
  -v couchdb_data:/opt/couchdb/data \
  ghcr.io/hcl-tech-software/couch-companion:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The container is based on the official CouchDB image with Fauxton swapped out for CouchCompanion. Give it a spin!&lt;/p&gt;</description>
	<link>2026/09/hcl-opensources-couchcompanion.html</link>
	<author>Stephan H. Wissel</author>
	<guid>ddda6a40-ac61-11f1-9ae8-ab82d9ffb6c8</guid>
	<pubDate>09 September 2026</pubDate>

</item>
<item>
	<title>Using age in Github actions</title>
	<description>&lt;p&gt;In the &lt;a href="/blog/2026/08/harden-your-developer-setup-with-age-and-direnv.html"&gt;last article&lt;/a&gt; I introduced &lt;a href="https://age-encryption.org/v1"&gt;age&lt;/a&gt; and a working setup for macOS. Now let's look at &lt;a href="https://github.com/features/actions"&gt;Github actions&lt;/a&gt; integration&lt;/p&gt;
&lt;h2&gt;&lt;a href="#tldr" id="tldr"&gt;&lt;/a&gt;TL/DR&lt;/h2&gt;
&lt;p&gt;In a nutshell: create an age key just for GitHub actions, commit it to secrets, add the public key to recipients.txt and add it to your github job.&lt;/p&gt;</description>
	<link>2026/08/using-age-in-github-actions.html</link>
	<author>Stephan H. Wissel</author>
	<guid>8935a740-9f9e-11f1-a017-d3bd802fd9ca</guid>
	<pubDate>24 August 2026</pubDate>

</item>
<item>
	<title>Harden your developer setup with age and direnv</title>
	<description>&lt;p&gt;Credential stealing &lt;a href="https://www.google.com/search?q=credential+stealing+news"&gt;is rampant&lt;/a&gt;, so some diligence in guarding API keys, passphrases and secrets is warranted.&lt;/p&gt;
&lt;p&gt;Stop wondering &lt;strong&gt;if&lt;/strong&gt; it could happen to you, but prepare for &lt;strong&gt;when&lt;/strong&gt; it might happen. Here is one arrow in your defense portfolio.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#limit-the-blast-radius" id="limit-the-blast-radius"&gt;&lt;/a&gt;Limit the blast radius&lt;/h2&gt;
&lt;p&gt;When an attacker sneaks by your &lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication"&gt;2FA&lt;/a&gt; using e.g a &lt;a href="https://en.wikipedia.org/wiki/Supply_chain_attack"&gt;supply chain attack&lt;/a&gt; your next line of defense is "How much can they see?"&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;For starters no key (other than public ones), token or credential shall live on disk unencrypted.&lt;/li&gt;
 &lt;li&gt;Loaded evn variables should be limited to their projects, when in &lt;code&gt;~/Code/someproject&lt;/code&gt; there must not be any env variable from &lt;code&gt;~/Code/otherproject&lt;/code&gt; be loaded.&lt;/li&gt;
 &lt;li&gt;The day-2-day use must be easy and convenient&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="#three-components" id="three-components"&gt;&lt;/a&gt;Three components&lt;/h2&gt;
&lt;p&gt;To make this work we need three components:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://support.apple.com/en-gb/guide/keychain-access/welcome/mac"&gt;macOS keychain&lt;/a&gt;: holds the AGE key(s), (Other operating systems is another story for another time).&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://age-encryption.org/v1"&gt;age&lt;/a&gt; "Actually good encryption": to encrypt your secrets and &lt;code&gt;.env&lt;/code&gt; variables.&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://direnv.net/"&gt;direnv&lt;/a&gt;: Loads and unloads environment variables depending on the current directory.&lt;/li&gt;
&lt;/ul&gt;</description>
	<link>2026/08/harden-your-developer-setup-with-age-and-direnv.html</link>
	<author>Stephan H. Wissel</author>
	<guid>f18ef260-9d14-11f1-ba45-6f0c0374234d</guid>
	<pubDate>21 August 2026</pubDate>

</item>
<item>
	<title>Use tmux to automate your developer setup</title>
	<description>&lt;svg xmlns="http://www.w3.org/2000/svg" class="adm-hidden"&gt;
 &lt;symbol id="adm-info"&gt;
  &lt;svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
   &lt;path d="m20.5 11.8c0 4.5-3.7 8.2-8.2 8.2s-8.2-3.7-8.2-8.2 3.7-8.2 8.2-8.2 8.2 3.7 8.2 8.2zm-6.7 4c-.1-.1-.2-.2-.2-.3v-4.5c0-.1.1-.2.2-.4s.2-.3.2-.3 0-.1-.1-.1c-.1-.1-.5-.2-1.2-.4-.7-.1-1.2-.2-1.5-.2-.5 0-.7 0-.7.1s.1.3.2.6v4.7c0 .3-.1.5-.2.6-.2.2-.2.3-.2.3.1.1.5.3 1.2.4.6.1 1.2.2 1.6.2h.3c.4-.1.5-.2.5-.5.1 0 .1-.1-.1-.2zm-.9-8.6c-.7-.1-1.2-.2-1.5-.2-.2 0-.5.2-.7.4s-.3.4-.3.6c0 .1 0 .1.1.2s.6.2 1.5.4c1 .3 1.5.4 1.6.3.1 0 .2-.2.3-.5s.2-.5.2-.6v-.1c-.1-.1-.5-.3-1.2-.5z" fill="currentColor" /&gt;
  &lt;/svg&gt;
 &lt;/symbol&gt;
&lt;/svg&gt;
&lt;p&gt;For my development setup I typically rely on &lt;a href="https://containers.dev/"&gt;Development Containers&lt;/a&gt; which works very UI centric. Your Ide discovers the &lt;code&gt;.devcontainer&lt;/code&gt; folder and boots an edit container and starts whatever you have defined in your &lt;code&gt;docker-compose.yml&lt;/code&gt; file. This is great for sharing, I &lt;a href="/blog/2024/05/devcontainers-the-fine-print.html"&gt;wrote about it&lt;/a&gt;, read for a refresher.&lt;/p&gt;
&lt;p&gt;In a terminal centric world this is a heavy approach and I want options&lt;/p&gt;
&lt;h2&gt;&lt;a href="#multiplex-your-terminal" id="multiplex-your-terminal"&gt;&lt;/a&gt;Multiplex your terminal&lt;/h2&gt;
&lt;p&gt;My goal: with a single script start &lt;code&gt;quarkus dev&lt;/code&gt;, twice &lt;code&gt;npm run dev&lt;/code&gt; and a database (&lt;a href="https://couchdb.apache.org/"&gt;Apache CouchDB&lt;/a&gt;, glad you asked). They all need to run in the foreground, so I can keep an eye on them. This precludes simply using &lt;code&gt;&amp;amp;&lt;/code&gt; to run them in the background.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://github.com/tmux/tmux/wiki"&gt;tmux&lt;/a&gt;. The wiki describes it: "&lt;em&gt;tmux is a terminal multiplexer. It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal.&lt;/em&gt;" Claude described it like this (might contain emscripten):&lt;/p&gt;
&lt;div class="adm-block adm-info"&gt;
 &lt;div class="adm-heading"&gt;
  &lt;svg class="adm-icon"&gt;
   &lt;use xlink:href="#adm-info" /&gt;
  &lt;/svg&gt;&lt;span&gt;Claude's take on tmux&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="adm-body"&gt;
  &lt;p&gt;Old habits die hard: you open a terminal, start a long running task, your SSH (Secure Shell) connection drops and your task dies with it. Enter tmux, the terminal multiplexer. It sits between your terminal and your shell sessions, so the sessions live on the server (or your machine), not in the window you happen to be looking at. Close the laptop, reconnect from the coffee shop, run tmux attach and everything is exactly where you left it.&lt;br&gt;
    Multiplexing is the second trick: one terminal window hosts multiple sessions, each with multiple windows (think tabs), each split into panes. API server on the left, logs on the right, a shell at the bottom — all navigated by keyboard, no mouse gymnastics required. Everything hangs off a prefix key, Ctrl-b by default, which the seasoned crowd promptly remaps to Ctrl-a (a habit inherited from GNU screen, tmux's venerable predecessor).&lt;br&gt;
    The price of admission is a modest set of keyboard shortcuts and, optionally, a &lt;code&gt;~/.tmux.conf&lt;/code&gt; to bend it to your will. The payoff: sessions that survive disconnects, scripted development environments that launch your entire workspace with one command, and even pair programming by attaching two people to the same session. As usual YMMV.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</description>
	<link>2026/08/use-tmux-to-automate-your-developer-setup.html</link>
	<author>Stephan H. Wissel</author>
	<guid>eb1cf600-95e1-11f1-9eae-8bf640f2554e</guid>
	<pubDate>12 August 2026</pubDate>

</item>
<item>
	<title>Signing your git commits</title>
	<description>&lt;p&gt;Code pedigree is more important than ever with the ever increasing rate of supply chain attacks. Setting up code signing are a few steps, recorded here for reference.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#choice-of-key-formats" id="choice-of-key-formats"&gt;&lt;/a&gt;Choice of key formats&lt;/h2&gt;
&lt;p&gt;While you could pick an &lt;code&gt;ssh&lt;/code&gt; or &lt;code&gt;x509&lt;/code&gt; key, I shall stick to &lt;code&gt;gpg&lt;/code&gt; and the &lt;code&gt;Ed25519&lt;/code&gt; algorythm.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#act-1-get-macos-ready" id="act-1-get-macos-ready"&gt;&lt;/a&gt;Act 1 - get macOS ready&lt;/h3&gt;
&lt;p&gt;When you followed &lt;a href="/blog/2025/08/installing-a-macos-developer-workstation.html"&gt;earlier advice&lt;/a&gt; you are good to go. If not, install &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; and dependencies&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;brew install gh gpg pinentry-mac

# setup pinentry
mkdir -p ~/.gnupg
chmod 700 ~/.gnupg
echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" &amp;gt;&amp;gt; ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href="#act-2-create-the-key" id="act-2-create-the-key"&gt;&lt;/a&gt;Act 2 - create the key&lt;/h3&gt;
&lt;p&gt;This creates a signing key that lasts for 2 years. Make sure to get the eMail right. After creation we extract the key id.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gpg --batch --quick-generate-key "John Doe &amp;lt;john.doe@example.com&amp;gt;" ed25519 sign
TARGET_EMAIL="john.doe@example.com"
GPG_KEY_ID=$(gpg --list-secret-keys --with-colons "$TARGET_EMAIL" 2&amp;gt;/dev/null \
             | awk -F: '$1=="sec" {print $5; exit}')
echo Your key id is $GPG_KEY_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You also can do that manually running &lt;code&gt;gpg --list-secret-keys --keyid-format=long&lt;/code&gt; and look for the string after the &lt;code&gt;/&lt;/code&gt; in the line starting with &lt;code&gt;sec&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#act-3-configure-your-local-git" id="act-3-configure-your-local-git"&gt;&lt;/a&gt;Act 3 - configure your local git&lt;/h3&gt;
&lt;p&gt;Make sure to get the eMail right&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;git config --global user.name "John Doe"
git config --global user.email "$TARGET_EMAIL"
git config --global user.signingkey "$GPG_KEY_ID"
git config --global commit.gpgsign true
git config --global tag.gpgsign true
git config --global pull.rebase true

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href="#act-4-let-github-know" id="act-4-let-github-know"&gt;&lt;/a&gt;Act 4 - Let github know&lt;/h3&gt;
&lt;p&gt;Display the public key:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gpg --armor --export $GPG_KEY_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go to your &lt;a href="https://github.com/settings/keys"&gt;Github key settings&lt;/a&gt;, click on "&lt;strong&gt;New GPG key&lt;/strong&gt;" and paste it&lt;/p&gt;
&lt;h3&gt;&lt;a href="#act-5-overwrite-for-individual-repos-optional" id="act-5-overwrite-for-individual-repos-optional"&gt;&lt;/a&gt;Act 5 - overwrite for individual repos (optional)&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;git config user.name "John Doe"
git config user.email "$TARGET_EMAIL"
git config user.signingkey "$GPG_KEY_ID"
git config commit.gpgsign true
git config tag.gpgsign true
git config pull.rebase true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For adventurous souls there is a &lt;a href="https://gist.github.com/Stwissel/1186dae6832f438a0d533e5770cbcced"&gt;setup script&lt;/a&gt; available to automate this. Use at your own risk.&lt;/p&gt;
&lt;p&gt;As usual YMMV&lt;/p&gt;</description>
	<link>2026/08/signing-your-git-commits.html</link>
	<author>Stephan H. Wissel</author>
	<guid>4c48f1f0-9131-11f1-bf74-5f1da76d7425</guid>
	<pubDate>06 August 2026</pubDate>

</item>
<item>
	<title>welcome http query</title>
	<description>&lt;p&gt;In 2026, after a 16 years pause, HTTP gained a new keyword &lt;a href="https://datatracker.ietf.org/doc/html/rfc10008"&gt;QUERY&lt;/a&gt;. Much &lt;a href="https://www.theregister.com/devops/2026/07/13/http-gets-a-query-method-so-complex-searches-can-stop-pretending-to-be-post/5270192"&gt;has been said&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/webdev/comments/1ummfyr/rfc_10008_is_official_the_http_query_method_is/?rdt=34595"&gt;said&lt;/a&gt; about the &lt;code&gt;GET&lt;/code&gt; with a body. But why did it take so long?&lt;/p&gt;
&lt;h2&gt;&lt;a href="#agreement-not-implementation" id="agreement-not-implementation"&gt;&lt;/a&gt;Agreement not implementation&lt;/h2&gt;
&lt;p&gt;I'll share a secret: QUERY has been &lt;a href="https://github.com/Stwissel/httpfun"&gt;supported&lt;/a&gt; by HTTP for a long time. So has &lt;code&gt;HTTP UNIVERSE&lt;/code&gt; or &lt;code&gt;HTTP TANGO&lt;/code&gt; The protocol doesn't care for the keyword. Your client an server care. &lt;code&gt;HTTP GET&lt;/code&gt; can't contain a body - nonsense. Of course it can. And you can expect, unless you control both sides, that it will fail in one way or another.&lt;/p&gt;
&lt;p&gt;So the &lt;a href="https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force"&gt;IETF&lt;/a&gt; standards are the etiquette of interaction, not the laws. They are the gentlemen agreement stating "If we both follow the RFC, we can have the reasonable expectation that this exchange of information could work".&lt;/p&gt;
&lt;p&gt;Hammering out agreements that don't break previous ones it time consuming and tedious, especially in venerable, foundational standards like http. just see how time tested the standards surrounding http are:&lt;/p&gt;
&lt;h3&gt;&lt;a href="#standards" id="standards"&gt;&lt;/a&gt;Standards&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Method&lt;/th&gt;
   &lt;th align="center"&gt;Standardized&lt;/th&gt;
   &lt;th&gt;Document&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;td&gt;GET&lt;/td&gt;
   &lt;td align="center"&gt;1991&lt;/td&gt;
   &lt;td&gt;HTTP/0.9&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;GET, HEAD, POST&lt;/td&gt;
   &lt;td align="center"&gt;1996&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc1945"&gt;RFC 1945&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;OPTIONS, PUT, DELETE, TRACE, CONNECT&lt;/td&gt;
   &lt;td align="center"&gt;1997&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc2068"&gt;RFC 2068&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;/td&gt;
   &lt;td align="center"&gt;refined 1999&lt;/td&gt;
   &lt;td&gt;(HTTP/1.1) &lt;a href="https://datatracker.ietf.org/doc/html/rfc2616"&gt;RFC 2616&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;PATCH&lt;/td&gt;
   &lt;td align="center"&gt;2010&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5789"&gt;RFC 5789&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Summarized HTTP semantics&lt;/td&gt;
   &lt;td align="center"&gt;2022&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/9110"&gt;RFC 9110&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;QUERY&lt;/td&gt;
   &lt;td align="center"&gt;2026&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/10008"&gt;RFC 10008&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;a href="#extensions" id="extensions"&gt;&lt;/a&gt;Extensions&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Extension&lt;/th&gt;
   &lt;th&gt;Since&lt;/th&gt;
   &lt;th&gt;Document&lt;/th&gt;
   &lt;th&gt;Methods added&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;td&gt;WebDAV (core)&lt;/td&gt;
   &lt;td&gt;1999&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/2518"&gt;RFC 2518&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;/td&gt;
   &lt;td&gt;revised 2007&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/4918"&gt;RFC 4918&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;DeltaV (versioning)&lt;/td&gt;
   &lt;td&gt;2002&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3253"&gt;RFC 3253&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;CHECKOUT, CHECKIN, VERSION-CONTROL, REPORT, MERGE, …&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Ordered Collections&lt;/td&gt;
   &lt;td&gt;2003&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3648"&gt;RFC 3648&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;ORDERPATCH&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;ACL (Access Control List)&lt;/td&gt;
   &lt;td&gt;2004&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3477"&gt;RFC 3744&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;ACL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;CalDAV (calendaring)&lt;/td&gt;
   &lt;td&gt;2007&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/4791"&gt;RFC 4791&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;MKCALENDAR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;SEARCH&lt;/strong&gt;&lt;/td&gt;
   &lt;td&gt;2008&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5323"&gt;RFC 5323&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;SEARCH&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;BIND (bindings)&lt;/td&gt;
   &lt;td&gt;2010&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5842"&gt;RFC 5842&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;BIND, UNBIND, REBIND&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;CardDAV (contacts)&lt;/td&gt;
   &lt;td&gt;2011&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/6352"&gt;RFC 6352&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;(reuses WebDAV methods)&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The WebDAV SEARCH method (2008) was the early inspiration for QUERY — drafts even used the name SEARCH before the working group settled on QUERY to avoid the WebDAV baggage and map cleanly onto the URI query component.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#http-anything" id="http-anything"&gt;&lt;/a&gt;HTTP anything&lt;/h3&gt;
&lt;p&gt;Don't believe &lt;code&gt;HTTP TANGO&lt;/code&gt; would work? Just clone my &lt;a href="https://github.com/Stwissel/httpfun"&gt;little fun project&lt;/a&gt;, run it and open the developer tools to watch the network.&lt;br&gt;
  Works, since it controls both ends.&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/images/2026/httpfun.png" alt="Fun with HTTP methods"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href="#tooling-needs-to-catch-up" id="tooling-needs-to-catch-up"&gt;&lt;/a&gt;Tooling needs to catch up&lt;/h3&gt;
&lt;p&gt;Now &lt;code&gt;QUERY&lt;/code&gt; is a standard, tooling needs to catch up. Enums need extension and adjacent standards updated. E.g &lt;a href="https://spec.openapis.org/oas/v3.0.3.html"&gt;OpenAPI 3.x&lt;/a&gt; has no provision for new HTTP syntax, while &lt;a href="https://www.usebruno.com/"&gt;Bruno&lt;/a&gt; and &lt;a href="https://curl.se/"&gt;curl&lt;/a&gt; do just fine.&lt;/p&gt;
&lt;p&gt;As usual YMMV&lt;/p&gt;</description>
	<link>2026/07/welcome-http-query.html</link>
	<author>Stephan H. Wissel</author>
	<guid>b6c47f10-81e9-11f1-b253-db3fcfbe8199</guid>
	<pubDate>17 July 2026</pubDate>

</item>

</channel>
</rss>
